package com.tn.controller.alarm.common.model;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import java.util.List;

/**
 * 分页工具
 *
 * @program: tn_aucy_java
 * @author: yangjiayao
 * @create: 2021/11/16
 */
@Getter
@Setter
@ToString
public class PageResult<T> {
    /**
     * 最小页长
     */
    private static final int MIN_PAGE_SIZE = 1;

    /**
     * 最大页长
     */
    private static final int MAX_PAGE_SIZE = 100;

    /**
     * 默认页长
     */
    private static final int DEFAULT_PAGE_SIZE = 10;

    /**
     * 当前页
     */
    private Integer curPage;

    /**
     * 页长
     */
    private Integer pageSize;

    /**
     * 总数
     */
    private Integer totalCount;

    /**
     * 总页数
     */
    private Integer totalPage;

    /**
     * 数据
     */
    private List<T> data;

    /**
     * 无参构造
     */
    public PageResult() {
        super();
        init(1, DEFAULT_PAGE_SIZE, 0);
    }

    /**
     * 构造
     *
     * @param curPage 当前页
     * @param totalCount 总数
     */
    public PageResult(int curPage, int totalCount) {
        init(curPage, DEFAULT_PAGE_SIZE, totalCount);
    }

    /**
     * 构造
     *
     * @param curPage 当前页
     * @param pageSize 页长
     * @param totalCount 总数
     */
    public PageResult(int curPage, int pageSize, int totalCount) {
        init(curPage, pageSize, totalCount);
    }

    /**
     * 构造
     *
     * @param curPage 当前页
     * @param pageSize 页长
     * @param totalCount 总数
     * @param data 数据
     */
    public PageResult(int curPage, int pageSize, int totalCount, List<T> data) {
        init(curPage, pageSize, totalCount);
        this.data = data;
    }

    /**
     * 初始化
     *
     * @param curPage 当前页
     * @param pageSize 页长
     * @param totalCount 总数
     */
    private void init(int curPage, int pageSize, int totalCount) {
        setPageSize(pageSize);
        setTotalCount(totalCount);
        this.totalPage = Math.max((this.totalCount + this.pageSize - 1) / this.pageSize, 1);
        initCurPage(curPage);
    }

    /**
     * 设置页长
     *
     * @param pageSize 页长
     */
    public void setPageSize(Integer pageSize) {
        this.pageSize = pageSize < MIN_PAGE_SIZE ? MIN_PAGE_SIZE : Math.min(pageSize, MAX_PAGE_SIZE);
    }

    /**
     * 设置总数
     *
     * @param totalCount 总数
     */
    public void setTotalCount(Integer totalCount) {
        this.totalCount = Math.max(totalCount, 0);
    }

    /**
     * 设置当前页数
     *
     * @param curPage 当前页
     */
    public void initCurPage(Integer curPage) {
        this.curPage = curPage < 1 ? 1 : Math.min(curPage, this.totalPage);
    }

    /**
     * 获取开始索引
     *
     * @return startIndex
     */
    public int getStartIndex() {
        return this.pageSize * (this.curPage - 1);
    }

    /**
     * 获取开始行号
     *
     * @return startColNum
     */
    public int getStartColNum() {
        return getStartIndex() + 1;
    }

}
